package labox.innovation.gameserver.templates.item;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import labox.innovation.config.Config;
import labox.innovation.gameserver.model.FriendNewsFactory;
import labox.innovation.gameserver.model.L2ItemInstance;
import labox.innovation.gameserver.model.actor.instance.FuzePcInstance;
import labox.innovation.gameserver.network.SystemMessageId;
import labox.innovation.gameserver.network.serverpackets.SystemMessage;
import labox.innovation.gameserver.templates.item.FuzeEconomicManager.OPSTATE;
import labox.innovation.gameserver.templates.item.ItemBouns.ItemBounsType;
import labox.innovation.gameserver.templates.item.ItemIdentifyConfig.ItemNums;
import labox.innovation.gameserver.templates.item.ItemStarConfig.ItemStarData;
import labox.innovation.util.Rnd;

/**
 * ��Ʒ׷��ϵͳ
 * 
 * @author zjj
 * 
 */
public class ItemStarManger {

	private static final int MAX_STAR_LVL = 12; // ���׷�ǵȼ�
	private static final int MAX_RAND = 10000; // �����ʿռ�
	public static final int KEEP_ITEMID = 26003; // �������id ʹ׷�ǲ����Ǽ� (�ݲ߻�˵�� ������Ʒ
	// ��һ��)

	static Logger _log = LoggerFactory.getLogger(ItemStarManger.class.getName());

	public static final ItemStarManger getInstance() {
		return SingletonHolder._instance;
	}

	public final static int STAR_RES_SUCESS = 0;
	public final static int STAR_RES_FAILED = 1;
	public final static int STAR_RES_NOT = 2;

	/**
	 * ����Ʒ����׷��
	 * 
	 * @param pc
	 * @param itemId
	 *            ��Ʒuid
	 * @param itemchanceId
	 *            Ӱ��׷�ǳɹ��ʵ���Ʒ���� uid
	 * @param itemkeepId
	 *            �������id ʹ��Ʒ����׷�ǵȼ� uid
	 * @return 0:�ɹ� 1:ʧ�� 2:����׷��
	 */
	public int statItem(FuzePcInstance pc, long itemId, long itemchanceId, long itemkeepId) {
		if (pc == null) {
			return STAR_RES_NOT;
		}
		L2ItemInstance item = pc.getInventory().getItemByObjectId(itemId);
		if (item == null) {
			return STAR_RES_NOT;
		}
		int chanceId = -1;
		int keepId = -1;
		L2ItemInstance temp = null;
		// ����׷�� ���ʵĵ��ߴ���
		if (itemchanceId > 0) {
			temp = pc.getInventory().getItemByObjectId(itemchanceId);
			if (temp == null) {
				return STAR_RES_NOT;
			}
			chanceId = temp.getItemId();
		}

		// ���� ׷�ǲ��� �ȼ�����Ʒ ����
		if (itemkeepId > 0) {
			temp = pc.getInventory().getItemByObjectId(itemkeepId);
			if (temp == null) {
				return STAR_RES_NOT;
			}
			keepId = temp.getItemId();
		}

		return statItem(pc, item, chanceId, keepId);
	}

	/**
	 * ����Ʒ����׷��
	 * 
	 * @param pc
	 *            : ��ɫ
	 * @param item
	 *            : ��Ʒ
	 * @param itemchanceId
	 *            : Ӱ��׷�ǳɹ��ʵ���Ʒ���� ģ��id
	 * @param itemkeepId
	 *            : �������id ʹ��Ʒ����׷�ǵȼ� ģ��id
	 * @return
	 */
	public int statItem(FuzePcInstance pc, L2ItemInstance item, int itemchanceId, int itemkeepId) {

		if (item == null) {
			return STAR_RES_NOT;
		}

		// �����Ʒ��׷�ǵȼ� �Ѵﵽ��� ��ô������׷��
		if (item.getStarLvl() >= ItemStarFactorConfig.getInstance().getStarLvlNums()) {
			pc.sendPacket(new SystemMessage(SystemMessageId.ITEM_STARLVL_MAX));
			return STAR_RES_NOT;
		}

		ItemStarData itemstarData = ItemStarConfig.getInstance().getItemStarData(item.getItemTypeString(), item.getItemLvl(), item.getStarLvl());

		// �����ĵ��ߵ����
		for (ItemNums itemnum : itemstarData._consumeItem) {
			L2ItemInstance itemIns = pc.getInventory().getItemByItemId(itemnum.itemId);

			if (itemIns == null) {
				SystemMessage sm = new SystemMessage(SystemMessageId.YOU_NOTHAVE_ITEM_S1);
				sm.addItemName(itemnum.itemId);
				pc.sendPacket(sm);
				return STAR_RES_NOT;
			}
			if (itemIns.getCount() < itemnum.itemNums) {
				return STAR_RES_NOT;
			}

		}// end
		// ��ɫ���ϵ�Ǯ�Ƿ��㹻

		// if ( !pc.getInventory().hasEnoughSilverMoney(
		// OPSTATE.FORGE.getValue() , pc , itemstarData._moneySilverNums ) )
		// {
		// pc.sendPacket( new SystemMessage(
		// SystemMessageId.YOU_NOT_ENOUGH_ADENA ));
		// return STAR_RES_NOT;
		// }

		if (pc.getMoneyNote() < itemstarData._moneySilverNums) {
			pc.sendPacket(new SystemMessage(SystemMessageId.NOT_ENOUGH_MONEY_NOTE));
			return STAR_RES_NOT;
		}

		int success = Rnd.get(MAX_RAND + 1);
		int chance = itemstarData._upchance; // ��ô˵ȼ��ĳɹ�����
		// ��� �������Ӱ��� �ɹ�����
		if (itemchanceId >= 0) {
			boolean isOk = false;
			for (ItemNums itemnum : itemstarData._affectItem) {
				if (itemnum.itemId == itemchanceId) {
					isOk = true;
					chance += itemnum.itemNums;
				}// end

			}// end

			// �����õĵ��߲��� ����׷��
			if (!isOk) {
				return STAR_RES_NOT;
			}

		}// end

		// ��� ����׷�ǵȼ���Ч��
		if (ItemStarFactorConfig.getInstance().isInclude(itemkeepId) || itemkeepId == KEEP_ITEMID) {
			boolean temp = pc.destroyItemByItemId("׷����ĵ���", itemkeepId, 1, pc, true);
			// ��Ʒ ������
			if (!temp) {
				return STAR_RES_NOT;
			}
		} else if (itemkeepId > 0) { // ����id ����
			return STAR_RES_NOT;
		}

		// ��� ���Ӽ��ʵĵ���
		if (itemchanceId >= 0) {
			boolean temp = pc.destroyItemByItemId("׷����ĵ���", itemchanceId, 1, pc, true);
			// ��Ʒ ������
			if (!temp) {
				return STAR_RES_NOT;
			}

		}

		// ��ĵ���
		for (ItemNums itemnum : itemstarData._consumeItem) {
			pc.destroyItemByItemId("׷����ĵ���", itemnum.itemId, itemnum.itemNums, pc, true);
		}// end

		if (itemstarData._moneyType == FuzeEconomicManager.MONEY_TYPE_SILVER) {
			// �۳��ɫ���ϵ�������
			pc.reduceMoneySilver(OPSTATE.FORGE.getValue(), itemstarData._moneySilverNums, null, true);
		} else if (itemstarData._moneyType == FuzeEconomicManager.MONEY_TYPE_NOTE) {
			pc.reduceMoneyNote("׷�����", itemstarData._moneySilverNums, null, true);
		} else if (itemstarData._moneyType == FuzeEconomicManager.MONEY_TYPE_YUANBAO) {
			pc.reduceMoneyYuanBao("׷�����", itemstarData._moneySilverNums, null, true);
		}

		// ׷��ʧ��
		if (success > chance) {
			// ���� ׷��ʧ�ܵ����
			starFailed(pc, itemstarData, item, itemkeepId);
			return STAR_RES_FAILED;
		}

		// ׷�ǳɹ�����
		starSuccessed(pc, itemstarData, item);

		return STAR_RES_SUCESS;

	}// end statItem

	/**
	 * ������Ʒ���Ǽ� ����Ϊ�����Ǽ����á�
	 * 
	 * @param item
	 * @param starlvl
	 *            : ���Ƶ�׷�Ǽ���
	 */
	public void starItem(L2ItemInstance item, int starlvl) {
		attachItemStar(item, starlvl);
	}

	/**
	 * ׷��ʧ�� ����
	 * 
	 * @param pc
	 * @param starData
	 *            : ׷�ǵ��������
	 * @param item
	 *            :
	 * @param itemkeepId
	 *            :������� ����׷�ǵȼ�
	 */
	protected void starFailed(FuzePcInstance pc, ItemStarData starData, L2ItemInstance item, int itemkeepId) {
		if (starData == null || item == null || pc == null) {
			_log.warn("׷���쳣���", Config.SERVER_ID);
			return;
		}

		if (ItemStarFactorConfig.getInstance().isInclude(itemkeepId) || itemkeepId == KEEP_ITEMID) {
			// ��� �б��ֲ����ȼ��ĵ��ߡ� ���ı䵱ǰ��׷������
			// ����׷��ʧ�ܵ���Ϣ
			return;
		}

		int starlvl = item.getStarLvl();
		if (starlvl <= 0) {
			// System.out.println(item.getItemName() + "��Ʒ׷�ǵȼ�Ϊ:" + starlvl );
			return;
		}

		starlvl = starlvl - starData._downgrade;
		if (starlvl <= 0) {
			starlvl = 0;
			item.setStarLvl(starlvl);
			item.removeItemBouns(ItemBounsType.STAR_BOUNS.ordinal());
			return;
		}

		ItemStarBouns itemstar = (ItemStarBouns) item.getItemBouns(ItemBounsType.STAR_BOUNS.ordinal());

		if (itemstar == null) {
			_log.warn(" װ��׷�����쳣��׷�ǵȼ���Ϊ0����׷����ݲ�����", Config.SERVER_ID);
			return;
		}

		// System.out.println("׷��ʧ�ܴ��� �����Ǽ�");
		item.setStarLvl(starlvl);
		itemstar.setStarLvl(starlvl);
		itemstar.update(item);

		_log.info("������Ʒ: ��ɫ:" + pc.getName() + "(" + pc.getObjectId() + ")" + "����Ʒ:" + item.getName() + "(" + item.getObjectId() + ")" + "׷��ʧ�ܡ��Ǽ�Ϊ:" + starlvl, pc.getObjectId(), pc.getName());

	}

	/**
	 * ׷�ǳɹ� ��������
	 * 
	 * @param pc
	 * @param starData
	 *            : ׷�����
	 * @param item
	 */
	protected void starSuccessed(FuzePcInstance pc, ItemStarData starData, L2ItemInstance item) {
		if (starData == null || item == null || pc == null) {
			_log.warn("׷���쳣���", Config.SERVER_ID);
			return;
		}

		attachItemStar(item, starData._starlvl + 1);

		_log.info("������Ʒ: ��ɫ:" + pc.getName() + "(" + pc.getObjectId() + ")" + "����Ʒ:" + item.getName() + "(" + item.getObjectId() + ")" + "׷�ǳɹ����Ǽ�Ϊ:" + (starData._starlvl + 1), pc.getObjectId(), pc.getName());

		// @author lian ��ӷ��ͺ��Ѷ�̬�߼�
		if (item.getStarLvl() == 6) {
			pc.getFriendInstance().getNewsManager().sendMessage(FriendNewsFactory.creatDamoMessage(pc, item), null);
		}

		item.reduceEndurance((int) (item.getEnduranceUp() * L2ItemInstance.REDUCEENRU_NUMS));

	}

	/**
	 * ����Ʒ������׷������
	 * 
	 * @param item
	 * @param starlvl
	 */
	protected void attachItemStar(L2ItemInstance item, int starlvl) {
		// ��� ׷�Ǽ��� ���ԣ� ֱ�ӷ���
		if (starlvl <= 0 && starlvl > ItemStarFactorConfig.getInstance().getStarLvlNums()) {
			_log.warn("�ṩ��׷�Ǽ��𲻶ԡ� �������ƶ���Χ", Config.SERVER_ID);
			return;
		}

		ItemStarBouns itemstar = (ItemStarBouns) item.getItemBouns(ItemBounsType.STAR_BOUNS.ordinal());
		if (itemstar == null) {
			itemstar = new ItemStarBouns();
		}

		item.setStarLvl(starlvl);
		itemstar.setStarLvl(starlvl);
		itemstar.update(item);
		item.addItemBouns(itemstar);

	}

	@SuppressWarnings("synthetic-access")
	private static class SingletonHolder {
		protected static final ItemStarManger _instance = new ItemStarManger();
	}

	private ItemStarManger() {
	}

}
